[Terraform]RDS拡張モニタリングのメトリクスをCloudWatchで可視化する
はじめに
コンサルティング部の神野です。
RDSの拡張モニタリングを有効にすることで、OSのメモリ使用量など追加で取得できるメトリクスが存在します。
拡張モニタリングのメトリクスはRDSコンソールでグラフにして確認は可能ですが、MAX1時間しか可視化することができず、標準メトリクスのようにCloudWatchのグラフで確認することはできません。
本記事では、拡張モニタリングで取得したメトリクスもTerraformを使ってCloudWatchで可視化していきます。
前提
今回はSQL Serverを使用し、ライセンスエディション・エンジンバージョンは下記の通りです。
DBエンジン種類 | ライセンスエディション | エンジンバージョン |
---|---|---|
SQL Server | Express | 16.00.4131.2.v1 |
構築
今回はTerraformで構築していきます。
前提
Terraformを使用するため事前にインストールが必要になります。
使用したバージョンは下記となります。
- Terraform・・・v1.9.4(provider registry.terraform.io/hashicorp/aws v5.61.0)
RDS
まずは拡張モニタリングを有効にしたRDSを作成します。拡張モニタリングをTerraformから有効にする際は、IAMロールが別途必要になるため併せて作成し、拡張モニタリング用のマネージドポリシーAmazonRDSEnhancedMonitoringRole
が必要なので作成するロールに紐付けしておきます。
また、拡張モニタリングの詳細度は60
秒で出力するようにします。
# ---------------------------------------------
# RDS
# ---------------------------------------------
resource "aws_db_instance" "sqlserver_example" {
identifier = "mydb-sqlserver-instance"
# SQL Server Express Edition
engine = "sqlserver-ex"
# 使用したいバージョンに適宜変更してください
engine_version = "16.00.4131.2.v1"
# SQL Serverに適したインスタンスクラス
instance_class = "db.t3.micro"
allocated_storage = 20
storage_type = "gp2"
# 任意のユーザ名
username = "XXX"
# 任意のパスワード
password = "XXX"
license_model = "license-included"
# 拡張モニタリングの設定
monitoring_interval = 60 # 60秒間隔でモニタリング
monitoring_role_arn = aws_iam_role.rds_monitoring_role.arn
# SQL Server固有の設定
port = 1433
timezone = "Tokyo Standard Time"
db_subnet_group_name = aws_db_subnet_group.rds.name
vpc_security_group_ids = [aws_security_group.rds.id]
# マルチAZ設定
multi_az = false
# メンテナンスウィンドウ
maintenance_window = "Sun:20:00-Sun:22:00"
# パラメータグループとオプショングループ
parameter_group_name = "default.sqlserver-ex-16.0"
option_group_name = "default:sqlserver-ex-16-00"
}
# ---------------------------------------------
# 拡張モニタリング用IAMロール
# ---------------------------------------------
resource "aws_iam_role" "rds_monitoring_role" {
name = "rds-monitoring-role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = "sts:AssumeRole"
Effect = "Allow"
Principal = {
Service = "monitoring.rds.amazonaws.com"
}
}
]
})
}
resource "aws_iam_role_policy_attachment" "rds_monitoring_policy" {
role = aws_iam_role.rds_monitoring_role.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonRDSEnhancedMonitoringRole"
}
CloudWatch
可視化するメトリクスフィルターのコードを書く前に、拡張モニタリングのログ構造を確認します。
拡張モニタリングのログ構造
拡張モニタリングを有効にすると、ロググループRDSOSMetrics
にログが格納されています。
今回は利用可能なメモリ量のメトリクスphysAvailKb
に注目して、構造を確認します。(後続でメトリクスフィルターを作成する際に参考になります)
個々の項目の詳細については公式ドキュメントを参照していただくといいかと思います。
{
"engine": "SqlServer",
"instanceID": "mydb-sqlserver-instance",
"instanceResourceID": "db-XXXX",
"timestamp": "2024-08-10T14:26:21Z",
"version": 1,
"uptime": "0 days, 02:04:16",
"numVCPUs": 2,
"cpuUtilization": {
"idle": 68.72,
"kern": 8.74,
"user": 22.54
},
"memory": {
"commitTotKb": 1548652,
"commitLimitKb": 2067996,
"commitPeakKb": 1794628,
"physTotKb": 1019420,
// ★今回可視化するメトリクス
"physAvailKb": 58648,
"sysCacheKb": 56596,
"kernTotKb": 272036,
"kernPagedKb": 151552,
"kernNonpagedKb": 120484,
"sqlServerTotKb": 127336,
"pageSize": 4096
},
// その他要素...
}
メトリクスフィルター作成
OS全体で利用可能なメモリ量physAvailKb
を可視化できるように、事前に確認したログ構造を元にメトリクスフィルターを作成します。
パターンとして作成したRDSとidentifier
が一致するログを取得する、かつphysAvailKb
が存在するログとしています。
$.instanceID = "${aws_db_instance.sqlserver_example.identifier}" && $.memory.physAvailKb > 0
# ---------------------------------------------
# メトリクスフィルター(OS利用可能なメモリ)
# ---------------------------------------------
resource "aws_cloudwatch_log_metric_filter" "rds_os_available_memory" {
name = "RDSMemoryUsed-${aws_db_instance.sqlserver_example.identifier}"
pattern = <<PATTERN
{ $.instanceID = "${aws_db_instance.sqlserver_example.identifier}" && $.memory.physAvailKb > 0 }
PATTERN
log_group_name = "RDSOSMetrics"
metric_transformation {
name = "PhysicalAvailableMemory"
namespace = "CustomRDSMetrics"
value = "$.memory.physAvailKb"
unit = "Kilobytes"
}
}
動作確認
コードを実行して環境を構築します。
構築後、CloudWatchのダッシュボードで作成したCustomRDSMetrics/PhysicalAvailableMemory
メトリクスが可視化されているか確認してみます。カスタムメトリクスの可視化
しっかりと可視化されていますね!
おわりに
拡張モニタリングのメトリクスを可視化する方法はいかがだったでしょうか?
もしTerraformを使って拡張モニタリングのメトリクスを継続的にウォッチしたいとなった際に少しでも参考になれば幸いです。